From 98b66acbdd213b85bdd176157277cbf6e95d0b18 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 18 Oct 2020 22:34:07 -0400 Subject: [PATCH] columview: Implement double-click to reset headers Implement the same behavior as GtkTreeView: double-click on the header boundary resets the header to its automatic width. Fixes: #3272 --- gtk/gtkcolumnview.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/gtk/gtkcolumnview.c b/gtk/gtkcolumnview.c index eea3bb2571..35a9b7a435 100644 --- a/gtk/gtkcolumnview.c +++ b/gtk/gtkcolumnview.c @@ -41,6 +41,7 @@ #include "gtkeventcontrollermotion.h" #include "gtkdragsource.h" #include "gtkeventcontrollerkey.h" +#include "gtkgestureclick.h" /** * SECTION:gtkcolumnview @@ -1186,6 +1187,36 @@ header_key_pressed (GtkEventControllerKey *controller, return FALSE; } +static void +header_pressed (GtkGestureClick *gesture, + int n_press, + double x, + double y, + GtkColumnView *self) +{ + int i, n; + + if (n_press != 2) + return; + + n = g_list_model_get_n_items (G_LIST_MODEL (self->columns)); + for (i = n - 1; i >= 0; i--) + { + GtkColumnViewColumn *column = g_list_model_get_item (G_LIST_MODEL (self->columns), i); + + g_object_unref (column); + + if (i + 1 < n && + gtk_column_view_column_get_resizable (column) && + gtk_column_view_in_resize_rect (self, column, x, y)) + { + gtk_gesture_set_state (self->drag_gesture, GTK_EVENT_SEQUENCE_DENIED); + gtk_column_view_column_set_fixed_width (column, -1); + break; + } + } +} + static void gtk_column_view_drag_motion (GtkDropControllerMotion *motion, double x, @@ -1221,6 +1252,11 @@ gtk_column_view_init (GtkColumnView *self) gtk_widget_set_layout_manager (self->header, gtk_column_view_layout_new (self)); gtk_widget_set_parent (self->header, GTK_WIDGET (self)); + controller = GTK_EVENT_CONTROLLER (gtk_gesture_click_new ()); + g_signal_connect (controller, "pressed", G_CALLBACK (header_pressed), self); + gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE); + gtk_widget_add_controller (self->header, controller); + controller = GTK_EVENT_CONTROLLER (gtk_gesture_drag_new ()); g_signal_connect (controller, "drag-begin", G_CALLBACK (header_drag_begin), self); g_signal_connect (controller, "drag-update", G_CALLBACK (header_drag_update), self); -- 2.30.2